# -*- coding: utf-8 -*-
# 作者： 安智军
# @Time：2022/6/24 22:13
# @Email：1010666711@qq.com
# @File： 1、什么是可迭代对象.py
'''
面试题：判断一个对象是否是可迭代对象
1、方法一、使用isinstance(对象， Iterable) 返回true 说明是
2、方法二、使用dir（对象） 看他有没有__iter__ 这个属性 有说明是
'''


def my_range(stop):
    '''
    手动模拟了python2 的range
    :param stop:
    :return:
    '''
    value = 1
    result = []
    while value < stop:
        result.append(value)
        value += 1
        # print(value)

    return result

# python2中有xrange这个函数
# python3中只有range


if __name__ == '__main__':
    print(my_range(10)) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
    # print(my_range(99999999999999999999999)) # 有严重的性能问题
    # print(my_range(999999))
    print(range(99999999999999999999999))  # range(0, 99999999999999999999999) python3的range

    # 什么是可迭代对象  怎么判断 看下有啥属性 有__iter__ 方法就是可迭代对象  缺点是可迭代

    print(dir(my_range(10))) # [.....'__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', ......]

    # 怎么判断
    from typing import Iterator, Iterable # Iterator 中文意思：迭代器  Iterable 中文意思：可迭代的

    print(isinstance(my_range(10),Iterator)) # False 可迭代对象不是个迭代器 因为没有 Iterator 属性
    # 如何把可迭代对象拥有迭代器的属性 使用iter() 方法 转化为迭代器类型
    print(isinstance(iter(my_range(10)),Iterator)) # True

    # 判断对象是否是可迭代对象
    print(isinstance(my_range(10),Iterable)) # True